package com.example.kotlinproject.ktlearn


//定义一个变量method01(函数引用),然后参数是a:Int,返回值(b:Int)->Int函数类型,={}是函数的实现
var method01:(a:Int)->(b:Int)->Int={
     var a =it+1
     println(it)
     10 //此处写10是因为println是个函数,如果不用东西隔起来,那么就会认为后面的{}是他的lambda表达式,所有函数后面都要用个东西隔起来

    //返回值实现
    {
        println(it)
        it
    }
}



//定义一个函数method02,参数是b:Int,返回值是(a:Int)->Int,={}是返回值的实现,这里的返回值是函数,可看做method04
fun method02(b:Int):(a:Int)->Int={
    println(b)
    println(it)
    it
}

fun method04(b:Int):(a:Int)->Int{

    return {
        println(b)
        println(it)
        it
    }
}


//定义一个变量method03(函数引用),然后参数是c:Int,返回值Int类型,={}是函数的实现
var method03:(c:Int)->Int={
    //返回值实现
    println(it)
    it
}

class KZ{//扩展类
    var c:Int = 0;
}

//扩展函数做参数
fun method05(a:Int,b:KZ.()->Int){
    b(KZ())//调用函数扩展函数b,此处需要传入KZ一个实例,表示调用这个方法实例化对象,后续的此方法的实现体中会有this代表此实例化对象
    println("method05 a==$a")
}

//扩展函数做参数
fun method06(a:Int,kz:KZ,b:KZ.()->Int){
    b(kz)//调用函数扩展函数b,此处的KZ对象是外部传入的,后续的此方法的实现体中会有this代表此实例化对象
    println("method05 a==$a")
}


// 定义method07(函数引用),引用的类型就是String的匿名扩展函数,所以method07可以当做String的扩展函数调用
var method07 : String.() -> Unit = {
    // this == String本身
    println("你是:$this")
}


fun main() {
    method01(5)(5)
    method02(7)(6)
    method03(8)
    method05(1){
        println("method05扩展 c=$c")
        c
    }


    var  kz =KZ()
    kz.c=6
    method06(1,kz){
        println("method06扩展 c=$c")
        c
    }

    //method07作为函数引用调用
    method07("aaa")
    //method07已经持有String类型的匿名函数的引用,所以它和匿名函数是等价的,把它作为String的一个函数
    "aaa".method07()

}